﻿using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using UC.BaseMVVM;

namespace UC.Login
{
    public interface ICadastroDeUsuarioModel : IModelBase
    {
        string NomeDeUsuario { get; set; }
        string Email { get; set; }
        string RepeticaoEmail { get; set; }
    }

    public class CadastroDeUsuarioModel : ModelBase, ICadastroDeUsuarioModel
    {
        private string _nomeDeUsuario;
        private string _email;
        private string _repeticaoEmail;
        private bool _enderecoResidencial;
        private bool _enderecoComercial;

        [Required(ErrorMessage = "O nome de usuário é obrigatório.")]
        [StringLength(20, ErrorMessage = "O campo nome deve ter no máximo 20 caracteres.")]
        [RegularExpression("[a-zA-Z]*", ErrorMessage = "O campo nome só pode ter letras com acentos e espaços.")]
        public string NomeDeUsuario
        {
            get { return _nomeDeUsuario; }
            set { _nomeDeUsuario = value; RaisePropertyChanged("NomeDeUsuario"); }
        }

        [Required]
        [EmailAddress(ErrorMessage = "O campo [e-mail] é de um formato inválido")]
        [StringLength(60, ErrorMessage = "O Email não poderá ter mais de 60 caracteres.")]
        public string Email
        {
            get { return _email; }
            set { _email = value; RaisePropertyChanged("Email"); }
        }

        //[Required(ErrorMessage = "A repetição de e-mail é obrigatória.")]
        [EmailAddress(ErrorMessage = "O campo [repetição de e-mail] é de um formato inválido")]
        [StringLength(60, ErrorMessage = @"O campo [repetição de e-mail] não poderá ter mais de 60 caracteres.")]
        [CustomValidation(typeof(CadastroDeUsuarioModel), "SameEmailValidate")]
        public string RepeticaoEmail
        {
            get { return _repeticaoEmail; }
            set { _repeticaoEmail = value; RaisePropertyChanged("RepeticaoEmail"); }
        }


        //[CustomValidation(typeof(CadastroDeUsuarioModel), "EscolhaTipoEndereco")]
        public bool TipoEndereco { get; set; }

        public bool EnderecoResidencial
        {
            get { return _enderecoResidencial; }
            set
            { 
                _enderecoResidencial = value; 
                RaisePropertyChanged("EnderecoResidencial");
            }
        }

        public bool EnderecoComercial
        {
            get { return _enderecoComercial; }
            set
            {
                _enderecoComercial = value;
                RaisePropertyChanged("EnderecoComercial");
            }
        }


        //public static ValidationResult EscolhaTipoEndereco(object obj, ValidationContext context)
        //{
            
        //}

        public static ValidationResult SameEmailValidate(object obj, ValidationContext context)
        {
            var user = (CadastroDeUsuarioModel)context.ObjectInstance;
            if (user.Email != user.RepeticaoEmail)
            {
                var memberNames = new List<string> {"Email", "RepeticaoEmail"};
                var sameEmailValidate = new ValidationResult("Os enderços de e-mails informados não são iguais.", memberNames);
                return sameEmailValidate;
            }
            return ValidationResult.Success;
        }
    }
}
